﻿using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Windows.Forms;
using FisheditIniEdit;
//using System.
namespace Roperation
{
    public class Rcore
    {
        public struct RbyteType
        {
            //public string dataStr;
            public int dataType;//0 int 1 string 2uint
            public string data;
            public short dataInt;
            public ushort dataUint;
            public string dataName;
            public string descriptionStr;
            public int TypeDef;//
        }
        public struct Rfile
        {
            public string GRPfilename;
            public string Idxfilename;
        }
        public struct Rdata0Type
        {
            public List<RbyteType> Rbyte;
            public int keyNameIndex;
        }
        public struct RdataType
        {
            public List<Rdata0Type> Rdata0;
            public string TypeName;
            //public int TypeDef;
        }
        public struct RNametype
        {
           public List<string> Rname;
           public List<string> Rgrp;
           public List<string> Ridx;
        }
        public static RNametype ReadRname()
        {
            sfeadd.IniOperation sfeini = new sfeadd.IniOperation(@".\fishedit.ini");
            string[] RidxTmp = sfeini.ReadIniString("File","RIdx").Split(',');
            string[] RgrpTmp = sfeini.ReadIniString("File", "RGRP").Split(',');
            string[] RgrpName = sfeini.ReadIniString("File", "RecordNote").Split(',');
            RNametype rtmp = new RNametype();
            rtmp.Rname = new List<string>();
            rtmp.Ridx = new List<string>();
            rtmp.Rgrp = new List<string>();
            for (int i = 0; i < RidxTmp.Length; i++)
            {
                rtmp.Rgrp.Add(RgrpTmp[i].ToString());
                rtmp.Ridx.Add(RidxTmp[i].ToString());
                rtmp.Rname.Add(RgrpName[i].ToString());
            }
            return rtmp;
        }
        //public static void SaveRanger(Rfile RfilePath, List<RdataType> data)
        //{
        //    try
        //    {
        //        List<inilist.R_modify> rini = inilist.ini2list(@".\fishedit.ini");
        //        List<RdataType> RMem = new List<RdataType>();
        //        //readidx
        //        List<int> rindex = new List<int>();
        //        using (FileStream fs = new FileStream(RfilePath.GRPfilename, FileMode.CreateNew))
        //        using (BinaryWriter br = new BinaryWriter(fs))
        //        {
        //            for(int i = 0;i<data.Count;i++)
        //            {
        //                for(int j = 0;j<data[i].Rdata0.Count;j++)
        //                {
        //                    for(int k = 0;k<data[i].Rdata0[j].Rbyte.Count;k++)
        //                    {
        //                        switch(data[i].Rdata0[j].Rbyte[k].dataType)
        //                        {
        //                            case 0:
        //                                br.Write((Int16)int.Parse(data[i].Rdata0[j].Rbyte[k].data));
        //                                break;
        //                            case 1:
        //                                string dataTradional =sfeadd.Str.SimpleToTradition(data[i].Rdata0[j].Rbyte[k].data);
        //                                sfeadd.Str.
        //                                Rtmp.data = sfeadd.Str.TraditionToSimple(dataTradional);
        //        }
        //        using (FileStream fs = new FileStream(RfilePath.Idxfilename, FileMode.CreateNew))
        //        using (BinaryWriter br = new BinaryWriter(fs))
        //        {
        //            rindex.Add((int)0);
        //            for (int i = 0; i < fs.Length / 4 - 1; i++)
        //            {
        //                //rindex.Add(br.Write(data[i].);
        //            }
        //        }
        //        //calc rini
        //        int[] Rlong = new int[rini.Count];
        //        for (int i = 0; i < rini.Count; i++)
        //        {
        //            for (int j = 0; j < rini[i].ListR.Count; j++)
        //            {
        //                Rlong[i] += int.Parse(rini[i].ListR[j].dataNum) *
        //                            int.Parse(rini[i].ListR[j].dataStructNum) *
        //                            int.Parse(rini[i].ListR[j].byteNum);
        //            }
        //        }
        //        //readgrp

        //        using (FileStream fs = new FileStream(RfilePath.GRPfilename, FileMode.Open))
        //        using (BinaryReader br = new BinaryReader(fs))
        //        {
        //            rindex.Add((int)fs.Length);
        //            for (int i = 0; i < rindex.Count - 1; i++)
        //            {
        //                RdataType Rdata = new RdataType();
        //                Rdata.Rdata0 = new List<Rdata0Type>();
        //                long tmpIndex = (long)rindex[i];
        //                Rdata.TypeName = rini[i].typeName;
        //                int tmpRdataNum = (int)(((long)rindex[i + 1] - tmpIndex) / Rlong[i]);
        //                for (int rnum = 0; rnum < tmpRdataNum; rnum++)
        //                {
        //                    Rdata0Type Rdata0 = new Rdata0Type();
        //                    Rdata0.Rbyte = new List<RbyteType>();
        //                    Rdata0.keyNameIndex = -1;
        //                    for (int ptrRiniIndex = 0; ptrRiniIndex < rini[i].ListR.Count; ptrRiniIndex += 0)
        //                    {
        //                        if (rini[i].ListR[ptrRiniIndex].isName == "1")
        //                            Rdata0.keyNameIndex = Rdata0.Rbyte.Count;

        //                        int tmpdatanum = int.Parse(rini[i].ListR[ptrRiniIndex].dataNum);
        //                        int tmpdataStructNum = int.Parse(rini[i].ListR[ptrRiniIndex].dataStructNum);
        //                        for (int j = 0; j < tmpdatanum; j++)
        //                        {
        //                            for (int k = 0; k < tmpdataStructNum; k++)
        //                            {
        //                                RbyteType Rtmp = new RbyteType();
        //                                switch (rini[i].ListR[ptrRiniIndex + k].isString)
        //                                {
        //                                    //int
        //                                    case "0":
        //                                        Rtmp.dataType = 0;
        //                                        Rtmp.data = br.ReadInt16().ToString();
        //                                        break;
        //                                    //str
        //                                    case "1":
        //                                        Rtmp.dataType = 1;

        //                                        string dataTradional = sfeadd.Str.Big5ToUnicode(br.ReadBytes(int.Parse(rini[i].ListR[ptrRiniIndex + k].byteNum))).Trim();
        //                                        Rtmp.data = sfeadd.Str.TraditionToSimple(dataTradional);
        //                                        break;
        //                                    case "2":
        //                                        Rtmp.dataType = 2;
        //                                        Rtmp.data = br.ReadUInt16().ToString();
        //                                        break;
        //                                    default:
        //                                        break;

        //                                }
        //                                Rtmp.TypeDef = int.Parse(rini[i].ListR[ptrRiniIndex + k].dataType);
        //                                Rtmp.dataName = string.Format(rini[i].ListR[ptrRiniIndex + k].nameStr, j);
        //                                Rtmp.descriptionStr = rini[i].ListR[ptrRiniIndex + k].DescriptionStr;
        //                                Rdata0.Rbyte.Add(Rtmp);
        //                                tmpIndex += int.Parse(rini[i].ListR[ptrRiniIndex + k].byteNum);
        //                            }
        //                        }
        //                        ptrRiniIndex += int.Parse(rini[i].ListR[ptrRiniIndex].dataStructNum);
        //                    }
        //                    Rdata.Rdata0.Add(Rdata0);
        //                }
        //                RMem.Add(Rdata);
        //            }
        //        }
        //       // return RMem;
        //    }
        //    catch (Exception ee)
        //    {
        //        MessageBox.Show(ee.Message);
        //      //  return null;
        //    }
        //}
        public static List<RdataType> ReadRanger(Rfile RfilePath)
        {
            try
            {
                List<inilist.R_modify> rini = inilist.ini2list(@".\fishedit.ini");
                List<RdataType> RMem = new List<RdataType>();
                //readidx
                List<int> rindex = new List<int>();
                using (FileStream fs = new FileStream(RfilePath.Idxfilename, FileMode.Open))
                using (BinaryReader br = new BinaryReader(fs))
                {
                    rindex.Add((int)0);
                    for (int i = 0; i < fs.Length / 4 - 1; i++)
                    {
                        rindex.Add(br.ReadInt32());
                    }
                }
                //calc rini
                int[] Rlong = new int[rini.Count];
                for (int i = 0; i < rini.Count; i++)
                {
                    for (int j = 0; j < rini[i].ListR.Count; j++)
                    {
                        Rlong[i] += int.Parse(rini[i].ListR[j].dataNum) *
                                    int.Parse(rini[i].ListR[j].dataStructNum) *
                                    int.Parse(rini[i].ListR[j].byteNum);
                    }
                }
                //readgrp

                using (FileStream fs = new FileStream(RfilePath.GRPfilename, FileMode.Open))
                using (BinaryReader br = new BinaryReader(fs))
                {
                    rindex.Add((int)fs.Length);
                    for (int i = 0; i < rindex.Count - 1; i++)
                    {
                        RdataType Rdata = new RdataType();
                        Rdata.Rdata0 = new List<Rdata0Type>();
                        long tmpIndex = (long)rindex[i];
                        Rdata.TypeName = rini[i].typeName;
                        int tmpRdataNum = (int)(((long)rindex[i + 1] - tmpIndex) / Rlong[i]);
                        for (int rnum = 0; rnum < tmpRdataNum; rnum++)
                        {
                            Rdata0Type Rdata0 = new Rdata0Type();
                            Rdata0.Rbyte = new List<RbyteType>();
                            Rdata0.keyNameIndex = -1;
                            for (int ptrRiniIndex = 0; ptrRiniIndex < rini[i].ListR.Count; ptrRiniIndex += 0)
                            {
                                if (rini[i].ListR[ptrRiniIndex].isName == "1")
                                    Rdata0.keyNameIndex = Rdata0.Rbyte.Count;

                                int tmpdatanum = int.Parse(rini[i].ListR[ptrRiniIndex].dataNum);
                                int tmpdataStructNum = int.Parse(rini[i].ListR[ptrRiniIndex].dataStructNum);
                                for (int j = 0; j < tmpdatanum; j++)
                                {
                                    for (int k = 0; k < tmpdataStructNum; k++)
                                    {
                                        RbyteType Rtmp = new RbyteType();
                                        switch (rini[i].ListR[ptrRiniIndex + k].isString)
                                        {
                                            //int
                                            case "0":
                                                Rtmp.dataType = 0;
                                                Rtmp.dataInt = br.ReadInt16();
                                                Rtmp.data = Rtmp.dataInt.ToString();
                                                break;
                                            //str
                                            case "1":
                                                Rtmp.dataType = 1;
                                                string dataTradional = sfeadd.Str.Big5ToUnicode(br.ReadBytes(int.Parse(rini[i].ListR[ptrRiniIndex + k].byteNum))).Trim();
                                                Rtmp.data = sfeadd.Str.TraditionToSimple(dataTradional);
                                                break;
                                            case "2":
                                                Rtmp.dataType = 2;
                                                Rtmp.dataUint = br.ReadUInt16();
                                                Rtmp.data = Rtmp.dataUint.ToString();
                                                //Rtmp.data = br.ReadUInt16().ToString();
                                                break;
                                            default:
                                                break;

                                        }
                                        Rtmp.TypeDef = int.Parse(rini[i].ListR[ptrRiniIndex + k].dataType);
                                        Rtmp.dataName = string.Format(rini[i].ListR[ptrRiniIndex + k].nameStr,j);
                                        Rtmp.descriptionStr = rini[i].ListR[ptrRiniIndex + k].DescriptionStr;
                                        Rdata0.Rbyte.Add(Rtmp);
                                        tmpIndex += int.Parse(rini[i].ListR[ptrRiniIndex + k].byteNum);
                                    }
                                }
                                ptrRiniIndex += int.Parse(rini[i].ListR[ptrRiniIndex].dataStructNum);
                            }
                            Rdata.Rdata0.Add(Rdata0);
                        }
                        RMem.Add(Rdata);
                    }
                }
                return RMem;
            }
            catch (Exception ee)
            {
                MessageBox.Show(ee.Message);
                return null;
            }
        }
    }
}
